package com.bjsxt.config.feign;

import com.bjsxt.util.ServletUtils;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.web.context.request.RequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**
 * description:
 * oauth2 授权方法的 feign 远程调用配置，配置了在进行 OpenFeign 远程调用的时候 Token 传递的问题
 *
 * @author ALIENWARE <br />
 * @date 2021/6/25
 */
@Slf4j
public class OAuth2FeignConfig implements RequestInterceptor {

    /**
     * Called for every request. Add data using methods on the supplied {@link RequestTemplate}.
     *
     * @param requestTemplate 请求客户端对象
     */
    @Override
    public void apply(RequestTemplate requestTemplate) {
        // 1 我们可以从request的上下文环境里面获取token
        RequestAttributes requestAttributes = ServletUtils.getRequestAttributes();
        if (requestAttributes == null) {
            log.info("没有请求的上下文,故无法进行token的传递");
        }
        // 进行 request 对象的获取
        HttpServletRequest request = ServletUtils.getRequest();
        // 取出 request 对象的 token 数据 , 获取我们请求上下文的头里面的AUTHORIZATION
        String token = request.getHeader(HttpHeaders.AUTHORIZATION);
        // 如果 token 数据不是空
        if (StringUtils.isNotBlank(token)) {
            // 进行请求头 token 数据的放入
            requestTemplate.header(HttpHeaders.AUTHORIZATION, token);
            log.info("本次token传递成功,token的值为:{}", token);
        }
    }
}
